# testa verificar_colisao_cenario()

import pygame,os,random
from pygame.locals import *
from Cenario import *
from Fase import *
from Snake import *
from Comida import *

from Persistencia import *
import Tkinter
import tkMessageBox
import tkSimpleDialog
from Tkinter import *

def main():
    pygame.init()

    screen = pygame.display.set_mode((600,600))
    pygame.display.set_caption('Hipersnake - Cristimas Snake')

    comida1 = Comida('Presente')
    comida2 = Comida('Bengala')
    comida3 = Comida('Estrela')
    comida4 = Comida('Estrela')

    cenario1 = Cenario('Cenario fase1')
    cenario2 = Cenario('Cenario fase2')
    cenario3 = Cenario('Cenario fase3')
    cenario4 = Cenario('Cenario fase4')

    fase1 = Fase('Fase1',cenario1)
    fase2 = Fase('Fase2',cenario2)
    fase3 = Fase('Fase3',cenario3)
    fase4 = Fase('Fase4',cenario4)

    snake = Snake()

    dirs = 0
    score = 0
    clock = pygame.time.Clock()
    fonte = pygame.font.SysFont('Arial',40)

    recordes = Persistencia(score)


    while True:
        for e in pygame.event.get():   # para a cobra se mexer
            if e.type == QUIT:
                sys.exit(0)
            elif e.type == KEYDOWN:     # dirs eh uma variavel que orienta o movimento da cobra, coerentemente
                if e.key == K_UP and dirs != 0:   # dirs representa numericamente a direcao do movimento da cobra
                    dirs = 2
                elif e.key == K_DOWN and dirs != 2:
                    dirs = 0
                elif e.key == K_LEFT and dirs != 1:
                    dirs = 3
                elif e.key == K_RIGHT and dirs != 3:
                    dirs = 1

        print snake.xs
        print snake.ys
        try:
            i = len(snake.xs)-2
            while i >= 2:
                print i
                if snake.colidir(snake.xs[0],snake.xs[i], snake.ys[0], snake.ys[i], 20, 20, 20, 20):   # se bater no proprio corpo
                    snake.morrer(screen,score,recordes)
                    print 'Colidiu com o proprio corpo'
                    dirs = 0
                i -= 1
        except IndexError:
            print 'Entrou no except apos index error'
            snake.morrer(screen,score,recordes)

        if score <= 5:
            fase1.blitar_cenario_fase(cenario1)
            fase1.mudar_clock(4)

            if score == 0:
                screen.blit(fonte.render('FASE 1',True, (255,0,0)),(200,10))

            if snake.verificar_colisao_comida(comida1):
                score += 1
                snake.xs.append(700)    # faz a cobra crescer, adiciona uma 'casa' no final de cada lista que descreve o movimento da cobra
                snake.ys.append(700)    # para entao substituir esse 700 por uma surface blitada na posicao final da cobra
                print snake.xs
                print snake.ys
                print 'Bateu na comida'
                comida1.escolher_posicao(cenario1)
                print 'Apareceu nova comida'

            comida1.aparecer_imagem_comida(cenario1)

            if snake.verificar_colisao_cenario(cenario1):
                snake.morrer(screen,score,recordes)
                dirs = 0
                print 'Bateu no cenario'
            
            if score == 5:
                screen.blit(fonte.render('FASE 2',True, (255,0,0)),(200,10))
            
        elif 5 < score <= 10:
            fase2.blitar_cenario_fase(cenario2)
            fase2.mudar_clock(5)

            if snake.verificar_colisao_comida(comida2):
                score += 1
                snake.xs.append(700)    # faz a cobra crescer, adiciona uma 'casa' no final de cada lista que descreve o movimento da cobra
                snake.ys.append(700)    # para entao substituir esse 700 por uma surface blitada na posicao final da cobra
                print snake.xs
                print snake.ys
                print 'Bateu na comida'
                comida2.escolher_posicao(cenario2)
                print 'Apareceu nova comida'

            comida2.aparecer_imagem_comida(cenario2)

            if snake.verificar_colisao_cenario(cenario2):
                snake.morrer(screen,score,recordes)
                dirs = 0
                print 'Bateu no cenario'
            
            if score == 10:
                screen.blit(fonte.render('FASE 3',True, (255,0,0)),(200,10))
          
        elif 10 < score <= 15:
            fase3.blitar_cenario_fase(cenario3)
            fase3.mudar_clock(7)

            if snake.verificar_colisao_comida(comida3):
                score += 1
                snake.xs.append(700)    # faz a cobra crescer, adiciona uma 'casa' no final de cada lista que descreve o movimento da cobra
                snake.ys.append(700)    # para entao substituir esse 700 por uma surface blitada na posicao final da cobra
                print snake.xs
                print snake.ys
                print 'Bateu na comida'
                comida3.escolher_posicao(cenario3)
                print 'Apareceu nova comida'

            comida3.aparecer_imagem_comida(cenario3)

            if snake.verificar_colisao_cenario(cenario3):
                snake.morrer(screen,score,recordes)
                dirs = 0
                print 'Bateu no cenario'
            
            if score == 15:
                screen.blit(fonte.render('FASE 4',True, (255,0,0)),(200,10))


        elif score > 15:
            fase4.blitar_cenario_fase(cenario4)
            fase4.mudar_clock(7)

            if snake.verificar_colisao_comida(comida4):
                score += 1
                snake.xs.append(700)    # faz a cobra crescer, adiciona uma 'casa' no final de cada lista que descreve o movimento da cobra
                snake.ys.append(700)    # para entao substituir esse 700 por uma surface blitada na posicao final da cobra
                print snake.xs
                print snake.ys
                print 'Bateu na comida'
                comida4.escolher_posicao(cenario3)
                print 'Apareceu nova comida'

            comida4.aparecer_imagem_comida(cenario4)

            if snake.verificar_colisao_cenario(cenario4):
                snake.morrer(screen,score,recordes)
                dirs = 0
                print 'Bateu no cenario'
            


        if snake.xs[0] < 0 or snake.xs[0] > 580 or snake.ys[0] < 0 or snake.ys[0] > 580:    # se bater nas extremidades da tela
            print 'Bateu nas extremidades da tela - morreu'
            snake.morrer(screen,score,recordes)
            dirs = 0   # estah descendo em y, para nao dah bug, quando renascer



        i = len(snake.xs)-1    # para comecar pegando o ultimo elemento da lista
        while i >= 1:
            snake.xs[i] = snake.xs[i-1]
            snake.ys[i] = snake.ys[i-1]
            i -= 1
        if dirs == 0:       # no comeco do jogo, a cobra estah descendo (y aumenta)
            snake.ys[0] += 20
        elif dirs == 1:
            snake.xs[0] += 20
        elif dirs == 2:
            snake.ys[0] -= 20
        elif dirs == 3:
            snake.xs[0] -= 20

        screen.blit(snake.escolher_imagem_corpo(dirs),(snake.xs[0],snake.ys[0]))
        for i in range(1,len(snake.xs)-1):    # blitando as imagens da cobra
            screen.blit(snake.aparecer_imagem_cobra(),(snake.xs[i],snake.ys[i]))
            print 'Blitou imagem cobra'


        t = fonte.render('SCORE: %s' % str(score),True,(255,0,0))  # para quando morrer aparecer o score no final

        screen.blit(t,(10,10))

        pygame.display.update()
